package UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * @Author: ylc
 * @Description:
 * @Date Created in 2022-04-28 16:56
 */
public class UDPServer {
    /*
        - java.net.DatagramSocket类
            用于发送和接收数据报包的套接字
        构造方法：
            DatagramSocket() 创建一个UDP数据报套接字的Socket，绑定到本机任意一个随机端口（一般用于客户端）
            DatagramSocket(int port) 创建一个UDP数据报套接字的Socket，绑定到本机指定的端口（一般用于服务端）
        成员方法：
            void receive(DatagramPacket p) 从此套接字接收数据报（如果没有接收到数据报，该方法会阻塞等待）
            void send(DatagramPacketp) 从此套接字发送数据报包（不会阻塞等待，直接发送）
            void close() 关闭此数据报套接字

        - java.net.DatagramPacket类
            UDP Socket发送和接收的数据报
        构造方法：
            DatagramPacket(byte[] buf, int length)
                接收的数据保存在字节数组（第一个参数buf）中，接收指定长度（第二个参数
            DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
                发送的数据为字节address指定目的主机的IP和端口号
         成员方法：
            InetAddress getAddress()
            int getPort()
            byte[] getData()
     */
    public static void main(String[] args) throws IOException {
            // 创建服务端DatagramSocket，指定端口，可以发送及接收UDP数据报
            DatagramSocket socket = new DatagramSocket(9999);
            while(true){
                    //创建DatagramPacket数据包用于接收数据
                    byte[] bytes = new byte[1024];
                    DatagramPacket packet = new DatagramPacket(bytes, bytes.length);

                    /*
                          等待接收客户端发送的UDP数据报，该方法在接收到数据报之前会一直阻塞
                          接收到数据报后，DatagramPacket对象中会包含数据（bytes）和客户端ip、端口号
                     */
                    socket.receive(packet);
                    System.out.println(packet.getAddress());
                    System.out.println(packet.getPort());
                    System.out.println(new String(packet.getData()));
            }
    }
}
